package com.xsjt.util;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Date;
import com.xsjt.bean.User;

/**  
 * ClassName:CopyBeanProperty
 * 在对象之间 进行属性值 复制 
 * Date:     2017年7月19日 下午5:53:07
 * @author   Joe  
 * @version    
 * @since    JDK 1.8
 */
public class CopyBeanProperty {
	
	/**
	 * 将 旧的bean的值 赋值 给 新的bean
	 * @param oldObj
	 * @param newObj
	 */
	public static void copyproperty(Object oldObj ,Object newObj){
		
		Class<?> clz = oldObj.getClass();
		Field[] cols = clz.getDeclaredFields();
		
		String name = null;
		Object value = null;
		try {
			for(Field col : cols){
				if(!col.isAccessible()){
					// 设置可访问
					col.setAccessible(true);
				}
				name = col.getName();
				value = col.get(oldObj);
				// 赋值给 新的bean
				setBeanProperty(name ,value ,newObj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 将 name 和  value 赋值给 新的bean
	 * @param name
	 * @param value
	 * @param newObj
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	private static void setBeanProperty(String name, Object value, Object newObj) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
		Class<?> clz = newObj.getClass();
		Field col = clz.getDeclaredField(name);
		if(!col.isAccessible()){
			// 设置可访问
			col.setAccessible(true);
		}
		col.set(newObj, value);
	}
	
	/**
	 * 循环输入 属性 和 值 ，测试的 时候 使用
	 * @param newObj
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	private static void loopBeanProperty(Object newObj) throws IllegalArgumentException, IllegalAccessException{
		Class<?> clz = newObj.getClass();
		Field[] cols = clz.getDeclaredFields();
		for(Field col : cols){
			if(!col.isAccessible()){
				// 设置可访问
				col.setAccessible(true);
			}
			System.out.println(col.getName() + "-->" + col.get(newObj));
		}
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		User user = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪");
		try {
			loopBeanProperty(user);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}
